/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.Scanner;

/**
 *
 * @author Fahmi
 */
public class Fisher extends Distribusi {

    private double v1;
    private double v2;
    private double n1 = getV1() + getV2();
    private double n2 = getV1();
    private double n3 = getV2();
    private double batasAtas;
    private double batasBawah;
    Scanner input = new Scanner(System.in);

    public Fisher() {
    }

    @Override
    public void pengertian() {
        System.out.println("Distribusi Fisher\n"
                + "Distribusi ini merupakan turunan Chi-Square\n"
                + "Distribusi ini biasanya digunakan untuk Uji ragam 2 populasi dan juga digunakan di ANOVA \n"
                + "Distribusi Fisher memiliki grafik yang menceng ke kanan \n"
                + "Distribusi ini tidak memiliki nilai negatif.");
    }

    @Override
    public void pdf() { //cekllagi fungsi yg ini, takutnya ada yang kurang
        System.out.println("Nilai peluang dari batas bawah "+getBatasBawah()+" sampai batas atas " + getBatasAtas() + " adalah dari Distribusi Fisher");
        System.out.println(faktorial(n1) / (faktorial(n2) * faktorial(n3)) * Math.pow(getV1() / getV2(), getV1() / 2) * integral(getBatasAtas()));
    }

    //public double beta(double n){
    //    return faktorial(n-1);
    //}
    public double integral(double batasAtas) {
        double hasil = 0;
        for (double i = getBatasBawah(); i <= batasAtas;) {
            if ((i == 0.01) || (i == batasAtas)) {
                hasil = hasil + Math.pow(i, getV1() / 2 - 1) * Math.pow((1 + getV1() / getV2() * i), (-(getV1() + getV2()) / 2));
            } else {
                hasil = hasil + 2 * Math.pow(i, getV1() / 2 - 1) * Math.pow((1 + getV1() / getV2() * i), (-(getV1() + getV2()) / 2));
            }
            i = i + 0.01;
        }
        return hasil;
    }

    public double faktorial(double pembilang) {

        if (pembilang == 0) {
            return 1;
        } else if (pembilang == 1) {
            return Math.sqrt(Math.PI);
        } else {
            return ((pembilang - 2) / 2) * faktorial(pembilang - 2);
        }
    }


    @Override
    public Mean mean() {
        if (this.getV2() <= 2) {
            System.out.println("Maaf, derajat bebas kedua harus lebih besar dari 2");
            return null;
        } else {            
            return new FisherMean(this);
        }
    }

    @Override
    public Varians varians() {
        if (this.getV2() <= 4) {
            System.out.print("Maaf, derajat bebas kedua harus lebih besar dari 4 ");
            return null;
        } else {
            return new FisherVarians(this);
        }
    }

    @Override
    public void standarDeviasi() {

        System.out.print(Math.sqrt(new FisherVarians(this).getVarians(this)));
    }

    @Override
    public void input() {
        System.out.println("Masukkan nilai derajat bebas ke-1 : ");
        this.v1 = input.nextDouble();
        System.out.println("Masukkan nilai derajat bebas ke-2 : ");
        this.v2 = input.nextDouble();
        System.out.println("Masukkan nilai batas atas : ");
        this.batasAtas = input.nextDouble();
       do {
            System.out.println("Masukkan nilai batas bawah : ");
            this.batasBawah = input.nextDouble();
       } while (getBatasBawah() < 0);
    }

    /**
     * @return the v1
     */
    public double getV1() {
        return v1;
    }

    /**
     * @return the v2
     */
    public double getV2() {
        return v2;
    }

    /**
     * @return the batasAtas
     */
    public double getBatasAtas() {
        return batasAtas;
    }

    /**
     * @return the batasBawah
     */
    public double getBatasBawah() {
        return batasBawah;
    }
}
